#include <TM1638plus.h>

//Origineel door Gavin Lyons
//Aangepast door EduTechSoft.nl
//Datum 12 september 2026

//Voor TM1638 op universele printplaat
#define  STROBE_TM 4 
#define  CLOCK_TM 3
#define  DIO_TM 2

//Voor Badge
//#define  STROBE_TM 2 
//#define  CLOCK_TM 3
//#define  DIO_TM 4

bool high_freq = false; //default false,, If using a high freq CPU > ~100 MHZ set to true.

//Constructor object (GPIO STB , GPIO CLOCK , GPIO DIO, use high freq MCU)
TM1638plus tm(STROBE_TM, CLOCK_TM , DIO_TM, high_freq);

char *myStrings[] = {"The Question is...   To PIE Or Not To BE ", "Arduino Nano met TM1638 key module ", "Theorie zonder prakijk is lam , Praktijk zonder theorie is blind ",
                     "Een goede leraar is het halve huiswerk ", "Een ELO waar muziek in zit - Eldorado ", "Licht ", "Down ", " UP "};
int Helderheid = 2, HelderheidOud = 2;
int Welketekst = 0;
int Knoppen = 0, Knoppenold = 0;
int ScrollSnelheid = 500;
String Samenvoegen;

void setup(){ 
  //Serial.begin(9600); // Voor debuggen
  tm.displayBegin();
  delay(50);
}

void loop(){
  Lichtkrant(); //Voor het scrollen van de teksten
}

void Lichtkrant(){
  unsigned long previousMillis_display = 0;  //Voor het opslaan van de laatst gebruikte tijd
  //De tekst van de array in een te bewerken char plaatsen, anders wordt de tekst gewist tijdens het scrollen gewist
  String BewaarTekst = "         "; // Aanloop van rechts beginnen
  BewaarTekst += myStrings[Welketekst];
  char charArray[BewaarTekst.length() + 1];
  BewaarTekst.toCharArray(charArray, sizeof(charArray));
  while(1){
    tm.displayText(charArray);
    unsigned long currentMillis = millis();
    Knoppen = tm.readButtons();
    if (Knoppenold!=Knoppen){
      LeesKnoppen();
      return;
    }
    yield(); // Added to prevent ESP8266 crash.
    if (currentMillis - previousMillis_display >= ScrollSnelheid){
      previousMillis_display = currentMillis;
      if (strlen(charArray) > 0){
        memmove(charArray, charArray+1, strlen(charArray));
        tm.displayText("        "); //Clear display or last character will drag across screen
      }else{
        return;
    }
   }
  }
}

void LeesKnoppen(){
  tm.displayText("        ");
  delay(25);
  Knoppen = tm.readButtons();
  if (Knoppenold!=Knoppen){
    doLEDs(Knoppen);
    Knoppenold = Knoppen;
    switch (Knoppen) {
      case 1:
        tm.displayText(myStrings[0]);
        Welketekst = 0;
        break;
      case 2:
        tm.displayText(myStrings[1]);
        Welketekst = 1;
        break;
      case 4:
        tm.displayText(myStrings[2]);
        Welketekst = 2;
        break;
      case 8:
        tm.displayText(myStrings[3]);
        Welketekst = 3;
        break;
      case 16:
        tm.displayText(myStrings[4]);
        Welketekst = 4;
        break;
      case 32:
        tm.displayText(myStrings[5]);
        //Helderheid
        Helderheid++;
        if (Helderheid > 3){
          Helderheid = 0;
        }
        if (HelderheidOud != Helderheid){
        Samenvoegen = String(myStrings[5]) + (Helderheid);
        char CharSamenvoegen[Samenvoegen.length() + 1];
        Samenvoegen.toCharArray(CharSamenvoegen, sizeof(CharSamenvoegen));
        tm.displayText(CharSamenvoegen);           
          tm.brightness(Helderheid);
          HelderheidOud = Helderheid;
        }
        break;
      case 64:
        tm.displayText(myStrings[6]);
        if(ScrollSnelheid < 1000){
          ScrollSnelheid = ScrollSnelheid + 50;
          Samenvoegen = String(myStrings[6]) + (ScrollSnelheid);
          char CharSamenvoegen[Samenvoegen.length() + 1];
          Samenvoegen.toCharArray(CharSamenvoegen, sizeof(CharSamenvoegen));
        tm.displayText(CharSamenvoegen);          
        }
        break;
      case 128:
        if(ScrollSnelheid >= 50){
          ScrollSnelheid = ScrollSnelheid - 50;
          Samenvoegen = String(myStrings[7]) + (ScrollSnelheid);
          char CharSamenvoegen[Samenvoegen.length() + 1];
          Samenvoegen.toCharArray(CharSamenvoegen, sizeof(CharSamenvoegen));
          tm.displayText(CharSamenvoegen);
        }
        break;
     default:
        // if nothing else matches, do the default
        // default is optional
        break;
    }      
    while (Knoppen == Knoppenold){
      Knoppen = tm.readButtons();
      delay(10);
    }
    Knoppenold = 0;
    doLEDs(0);
  }
}

void doLEDs(uint8_t value){
  //Laat van de bediende knoppen de bijbehorende led's branden
  for (uint8_t LEDposition = 0; LEDposition < 8; LEDposition++) {
    tm.setLED(LEDposition, value & 1);
    value = value >> 1;
  }
}